package com.Sake.common.core.activeMQ;

import org.apache.activemq.ScheduledMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jms.JmsProperties;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Service;

import javax.jms.*;
import java.io.Serializable;

/**
 * 直播间生产者
 *
 * @author zsh
 * @version 1.0.0
 * @date 2021.6.16
 */
@Service("RoomProducer")
public class JmsRoomProducer {

    @Autowired
    private JmsMessagingTemplate jmsTemplate;

    public static final Logger logger = LoggerFactory.getLogger(JmsRoomProducer.class);

    /**
     * 延时发送
     * @param destination 发送的队列
     * @param data 发送的消息
     * @param time 延迟时间
     */
    public <T extends Serializable> void delaySend(String destination, T data, Long time){
        logger.info("延时发送》》》》》》》》》》》》》》》》创建直播间时修改状态修改消息 队列: "+destination+" 延时 : "+time+" 秒");
        Connection connection = null;
        Session session = null;
        MessageProducer producer = null;
        // 获取连接工厂
        ConnectionFactory connectionFactory = jmsTemplate.getConnectionFactory();
        try {
            //获取连接
            connection = connectionFactory.createConnection();
            //开启链接
            connection.start();
            //获取session，true开启事务，false关闭事务
            //Session.AUTO_ACKNOWLEDGE 为自动确认，客户端发送和接收消息不需要做额外的工作，哪怕是接收端发生异常，也会当作正常发送成功。
            //Session.CLIENT_ACKNOWLEDGE 为客户端确认，客户端接收到消息后，必须调用javax.jms.Message的acknowledge方法，jms服务器才会当作发送成功，并删除消息。
            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
            //创建一个到达的目的地（activemq不可能同时只能跑一个队列）
            //这里就是连接了一个名为destination的队列，这个会话将会进入这个队列，当然，如果这个队列不存在，将会新创建此队列
            Destination destination1 = session.createQueue(destination);
            //从会话中，获取一个消息生产者
            producer = session.createProducer(destination1);
            //设置生产者的模式
            //DeliveryMode.PERSISTENT 表示当activemq关闭的时候，队列数据将会被保存
            producer.setDeliveryMode(JmsProperties.DeliveryMode.PERSISTENT.getValue());
            //创建一条消息，消息的类型有很多，如文字，字节，对象等,可以通过session.create..方法创建出来
            ObjectMessage message = session.createObjectMessage(data);
            //设置延迟时间，单位为毫秒
            message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, time);
            //生产者发送消息
            producer.send(message);
            //会话提交，等待消费者消费队列中未消费的消息
            session.commit();

        } catch (Exception e){
            e.printStackTrace();
            logger.error("延时发送异常");
        } finally {
            try {
                if (producer != null){
                    producer.close();
                }
                if (session != null){
                    session.close();
                }
                if (connection != null){
                    connection.close();
                }
            } catch (Exception e){
                e.printStackTrace();
            }
        }
    }


    /** 即时发送消息，destination是发送到的队列，message是待发送的消息
     * @param destination
     * @param message
     */
    public void sendMessage(Destination destination, final String message){
        jmsTemplate.convertAndSend(destination, message);
    }


}

